import java.util.Arrays;

public class AccentRemover {
        
        private static char[] SPECIAL_CHARACTERS = { ' ', '!', '"', '#', '$', '%', 
                        '*', '+', ',', '.', ':', '<', '=', '>', '?', '@', '[', '\\', ']', '^', 
                        '`', '|', '~', 'À', 'Á', 'Â', 'Ã', 'È', 'É', 'Ê', 'Ì', 'Í', 'Ò', 
                        'Ó', 'Ô', 'Õ', 'Ù', 'Ú', 'Ý', 'à', 'á', 'â', 'ã', 'è', 'é', 'ê',
                        'ì', 'í', 'ò', 'ó', 'ô', 'õ', 'ù', 'ú', 'ý', 'Ă', 'ă', 'Đ', 'đ',
                        'Ĩ', 'ĩ', 'Ũ', 'ũ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ạ', 'ạ', 'Ả', 'ả', 'Ấ',
                        'ấ', 'Ầ', 'ầ', 'Ẩ', 'ẩ', 'Ẫ', 'ẫ', 'Ậ', 'ậ', 'Ắ', 'ắ', 'Ằ', 'ằ',
                        'Ẳ', 'ẳ', 'Ẵ', 'ẵ', 'Ặ', 'ặ', 'Ẹ', 'ẹ', 'Ẻ', 'ẻ', 'Ẽ', 'ẽ', 'Ế',
                        'ế', 'Ề', 'ề', 'Ể', 'ể', 'Ễ', 'ễ', 'Ệ', 'ệ', 'Ỉ', 'ỉ', 'Ị', 'ị',
                        'Ọ', 'ọ', 'Ỏ', 'ỏ', 'Ố', 'ố', 'Ồ', 'ồ', 'Ổ', 'ổ', 'Ỗ', 'ỗ', 'Ộ',
                        'ộ', 'Ớ', 'ớ', 'Ờ', 'ờ', 'Ở', 'ở', 'Ỡ', 'ỡ', 'Ợ', 'ợ', 'Ụ', 'ụ',
                        'Ủ', 'ủ', 'Ứ', 'ứ', 'Ừ', 'ừ', 'Ử', 'ử', 'Ữ', 'ữ', 'Ự', 'ự', 
                        'Ỵ', 'ỵ','Ỷ', 'ỷ', 'Ý', 'ý', 'Ỳ', 'ỳ', 'Ỹ', 'ỹ',};

        private static char[] REPLACEMENTS = { '+', '\0', '\0', '\0', '\0', '\0', 
                        '\0', '_', '\0', '\0', '_', '\0', '\0', '\0', '\0', '\0', '\0', '_','\0', '\0', 
                        '\0', '\0', '\0', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'i', 'i', 'o',
                        'o', 'o', 'o', 'u', 'u', 'y', 'a', 'a', 'a', 'a','e', 'e', 'e', 
                        'i', 'i', 'o', 'o', 'o', 'o', 'u', 'u', 'y', 'A', 'a', 'd', 'd', 
                        'i', 'i', 'u', 'u', 'o', 'o', 'u', 'u', 'a', 'a', 'a', 'a', 'a', 
                        'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
                        'a', 'a', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 
                        'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
                        'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o',
                        'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u',
                        'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 
                        'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y',};
        
        private static char[] SPECIAL_CHARACTERS2 = { '!', '"', '#', '$', '%', 
            '*', '+', ',', '.', ':', '<', '=', '>', '?', '@', '[', '\\', ']', '^', 
            '`', '|', '~', 'À', 'Á', 'Â', 'Ã', 'È', 'É', 'Ê', 'Ì', 'Í', 'Ò', 
            'Ó', 'Ô', 'Õ', 'Ù', 'Ú', 'Ý', 'à', 'á', 'â', 'ã', 'è', 'é', 'ê',
            'ì', 'í', 'ò', 'ó', 'ô', 'õ', 'ù', 'ú', 'ý', 'Ă', 'ă', 'Đ', 'đ',
            'Ĩ', 'ĩ', 'Ũ', 'ũ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ạ', 'ạ', 'Ả', 'ả', 'Ấ',
            'ấ', 'Ầ', 'ầ', 'Ẩ', 'ẩ', 'Ẫ', 'ẫ', 'Ậ', 'ậ', 'Ắ', 'ắ', 'Ằ', 'ằ',
            'Ẳ', 'ẳ', 'Ẵ', 'ẵ', 'Ặ', 'ặ', 'Ẹ', 'ẹ', 'Ẻ', 'ẻ', 'Ẽ', 'ẽ', 'Ế',
            'ế', 'Ề', 'ề', 'Ể', 'ể', 'Ễ', 'ễ', 'Ệ', 'ệ', 'Ỉ', 'ỉ', 'Ị', 'ị',
            'Ọ', 'ọ', 'Ỏ', 'ỏ', 'Ố', 'ố', 'Ồ', 'ồ', 'Ổ', 'ổ', 'Ỗ', 'ỗ', 'Ộ',
            'ộ', 'Ớ', 'ớ', 'Ờ', 'ờ', 'Ở', 'ở', 'Ỡ', 'ỡ', 'Ợ', 'ợ', 'Ụ', 'ụ',
            'Ủ', 'ủ', 'Ứ', 'ứ', 'Ừ', 'ừ', 'Ử', 'ử', 'Ữ', 'ữ', 'Ự', 'ự', 
            'Ỵ', 'ỵ','Ỷ', 'ỷ', 'Ý', 'ý', 'Ỳ', 'ỳ', 'Ỹ', 'ỹ',};

private static char[] REPLACEMENTS2 = { '\0', '\0', '\0', '\0', '\0', 
            '\0', '_', '\0', '\0', '_', '\0', '\0', '\0', '\0', '\0', '\0', '_','\0', '\0', 
            '\0', '\0', '\0', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'i', 'i', 'o',
            'o', 'o', 'o', 'u', 'u', 'y', 'a', 'a', 'a', 'a','e', 'e', 'e', 
            'i', 'i', 'o', 'o', 'o', 'o', 'u', 'u', 'y', 'A', 'a', 'd', 'd', 
            'i', 'i', 'u', 'u', 'o', 'o', 'u', 'u', 'a', 'a', 'a', 'a', 'a', 
            'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
            'a', 'a', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 
            'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
            'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o',
            'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u',
            'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 
            'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y',};
                        

        public static String toUrlFriendly(String s) {
        		//s = s.trim();
        		s = ChuanHoaDau(s);
                int maxLength = Math.min(s.length(), 236);
                char[] buffer = new char[maxLength];
                int n = 0;
                for (int i = 0; i < maxLength; i++) {
                        char ch = s.charAt(i);
                        buffer[n] = removeAccent(ch);
                        // skip not printable characters
                        if (buffer[n] > 31) {
                                n++;
                        }
                }
                // skip trailing slashes
                while (n > 0 && buffer[n - 1] == '/') {
                        n--;
                }
                return ChuanHoaSau(String.valueOf(buffer, 0, n).toLowerCase());
        }
        
        public static String toRemoveVNese(String s) {
    		//s = s.trim();
    		s = ChuanHoaDau(s);
            int maxLength = Math.min(s.length(), 236);
            char[] buffer = new char[maxLength];
            int n = 0;
            for (int i = 0; i < maxLength; i++) {
                    char ch = s.charAt(i);
                    buffer[n] = removeAccentVNese(ch);
                    // skip not printable characters
                    if (buffer[n] > 31) {
                            n++;
                    }
            }
            // skip trailing slashes
            while (n > 0 && buffer[n - 1] == '/') {
                    n--;
            }
            return ChuanHoaDau(String.valueOf(buffer, 0, n).toLowerCase().trim());
    }
        
        public static char removeAccentVNese(char ch) {
            int index = Arrays.binarySearch(SPECIAL_CHARACTERS2, ch);
            if (index >= 0) {
                    ch = REPLACEMENTS2[index];
            }
            return ch;
    }

        public static char removeAccent(char ch) {
                int index = Arrays.binarySearch(SPECIAL_CHARACTERS, ch);
                if (index >= 0) {
                        ch = REPLACEMENTS[index];
                }
                return ch;
        }
        
        public static String removeAccent(String s) {
                StringBuilder sb = new StringBuilder(s);
                for (int i = 0; i < sb.length(); i++) {
                        sb.setCharAt(i, removeAccent(sb.charAt(i)));
                }
                return sb.toString().toLowerCase();
        }
        
        public static String ChuanHoaDau(String s) 
        { 
            int space = 0; 
            // Duyet het chuoi 
            for (int i = 0; i < s.length(); i++) 
            { 
                if (s.charAt(i) == ' ') 
                    space++; // Tim duoc space 
                else 
                space = 0; // Quay lai 1 tu moi khi ket thuc space 
                if (space > 1) 
                { 
                    space = 0; 
                    do 
                    { 
                        if (s.charAt(i) == ' ') 
                            s = s.replace("  ", " "); 
                    } while (s.charAt(i) == ' '); 
                } 
            } 
           s = s.trim(); // Xóa khoảng trắng đầu và cuối 
           return s;
        }
        
        public static String ChuanHoaSau(String s) 
        { 
            int space = 0; 
            // Duyet het chuoi 
            for (int i = 0; i < s.length(); i++) 
            { 
                if (s.charAt(i) == '+') 
                    space++; // Tim duoc space 
                else 
                space = 0; // Quay lai 1 tu moi khi ket thuc space 
                if (space > 1) 
                { 
                    space = 0; 
                    do 
                    { 
                        if (s.charAt(i) == '+') 
                            s = s.replace("++", "+"); 
                    } while (s.charAt(i) == '+'); 
                } 
            } 
           s = s.trim(); // Xóa khoảng trắng đầu và cuối 
           return s;
        }
        
        public static void main(String[] args) {
        	String a = toRemoveVNese(" Đóng góp: Cái cây xanh xanh Thì lá cũng xanh Chim đậu trên cành Chim hót líu lo Líu lo là líu lo Líu lo là líu lo.................. .................... .................... .................... .................... .................... .................... .................... .......... ");
    		System.out.print(a);
    		System.out.println(toUrlFriendly("CHUYỆN TÌNH YÊU"));
    	}
        
}